﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ExtremeEvents.Models;
using System.Web.Security;
using System.Data.Entity;
using System.Data;
using System.Data.SqlClient;

namespace ExtremeEvents.Controllers
{
    [Authorize(Roles = "Utilizador")]
    public class UtilizadorController : Controller
    {
        //
        // GET: /Utilizador/

        public ActionResult Index()
        {
            return View();
        }

        //
        // GET: /Utilizador/Edit
        public ActionResult Edit()
        {
            Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey; //Guid do utilizador
            string userId = userGuid.ToString();

            ExtremeEventsIntity db = new ExtremeEventsIntity();
            //Executar o store procedure e retornar um objeto.
            //Para este algoritmo funcionar é IMPORTANTE ter o store procedure na BD
            db.EditUtilizadores.SqlQuery("EXEC ext.procurarUtilizador_porGuid {0}", userGuid).ToList();
            EditUtilizador utilizador = db.EditUtilizadores.Find(userGuid);
            utilizador.Password_Atual = "";
            utilizador.Password_Nova = "";
            return View(utilizador);
        }

        //
        // POST: /Utilizador/Edit

        [HttpPost]
        public ActionResult Edit(EditUtilizador utilizador)
        {
            if (ModelState.IsValid)
            {
                bool changeUserSucceeded=true;
                bool changeUserPassword=true;

                ExtremeEventsIntity db = new ExtremeEventsIntity();
                object[] param = new object[14];  // Objeto que vai conter os parametros do utilizador
                try
                {
                    MembershipUser user = Membership.GetUser(utilizador.guid); //Procurar user no Membership
                    //user.Email = utilizador.Email; //Actualizar email do utilizador
                    //Só altera a password se o utilizador colocar uma nova password.
                    //Caso o utilizador nao preencher o campo password nova então o sistema só altera os restantes dados do utilizador
                    if (String.IsNullOrEmpty(utilizador.Password_Nova) == false)
                    {
                        //Confição de segurança.
                        //Para nao permitir o utilizador de utilizar null na password atual.
                        if (string.IsNullOrEmpty(utilizador.Password_Atual) == false)
                        {
                            changeUserPassword = user.ChangePassword(utilizador.Password_Atual, utilizador.Password_Nova); //Alterar password do utilizador
                        }
                        else
                        {
                            changeUserPassword = false;
                        }
                        if (changeUserPassword==false)
                        {
                            ModelState.AddModelError("", "Error_25: Erro na alteração da password.");
                            return View(utilizador);
                        }
                    }

                    Membership.UpdateUser(user); //Actualizar user no Membership                  
                }
                catch (System.ArgumentException)
                {
                    changeUserSucceeded = false;
                }

                try
                {                    
                    //Preencher os parametros do utilizador 
                    param[0] = utilizador.guid;
                    param[1] = utilizador.Email;
                    param[2] = utilizador.Primeiro_Nome;
                    param[3] = utilizador.Ultimo_Nome;
                    param[4] = utilizador.Nif;
                    param[5] = utilizador.Nome_Organizacao;
                    param[6] = utilizador.Genero;
                    param[7] = utilizador.Morada;
                    param[8] = utilizador.Numero;
                    param[9] = utilizador.Codigo_Postal;
                    param[10] = utilizador.Distrito;
                    param[11] = utilizador.Concelho;
                    param[12] = utilizador.Freguesia;
                    param[13] = utilizador.Pais;
                    //Executar o SP de actualizar o utilizador
                    db.Database.ExecuteSqlCommand("EXEC ext.editarUtilizador {0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}", param);
                }
                 //Se exister erro na BD ao fazer update do utilizador, então retorna o error_22
                catch (SqlException)
                {
                    changeUserSucceeded = false;
                }

                if (changeUserSucceeded)
                {
                    return RedirectToAction("EditSuccess");
                }
                else
                {
                    ModelState.AddModelError("", "Error_22: Ocorreram erros ao alterar a conta. Por favor corrija os erros e tente de novo.");

                }

            }
            else
            {
                ModelState.AddModelError("", "Error_24: Ocorreram erros ao actulizar o utilizador, verifique se todos os campos estão corretos");
            }
            return View(utilizador);
        }

        public ActionResult EditSuccess()
        {
            return View();
        }

        //
        // GET: /Utilizador/DesativarConta
        public ActionResult DesativarConta()
        {
            Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey; //Guid do utilizador
            string userId = userGuid.ToString();

            ExtremeEventsIntity db = new ExtremeEventsIntity();
            //Executar o store procedure e retornar um objeto.
            //Para este algoritmo funcionar é IMPORTANTE ter o store procedure na BD
            db.EditUtilizadores.SqlQuery("EXEC ext.procurarUtilizador_porGuid {0}", userGuid).ToList(); 
            EditUtilizador utilizador = db.EditUtilizadores.Find(userGuid);
            return View(utilizador);
        }

        //
        // POST: /Utilizador/Edit

        [HttpPost]
        public ActionResult DesativarConta(EditUtilizador utilizador)
        {
            if (ModelState.IsValid)
            {
                ExtremeEventsIntity db = new ExtremeEventsIntity();
                object[] param = new object[2];  // Objeto que vai conter os parametros do utilizador
                //Preencher os parametros do utilizador 
                param[0] = utilizador.guid;
                param[1] = true;
                //Executar o SP de alterar estado do utilizador
                db.Database.ExecuteSqlCommand("EXEC ext.alterarEstadoUtilizador {0}, {1}", param);
                //Fazer logout do membership
                FormsAuthentication.SignOut();
                return RedirectToAction("Index", "Home");

            }
            else
            {
                ModelState.AddModelError("", "Error_23: Erro de validação da ação.");
            }
            return View(utilizador);
        }

        public ActionResult DesativarSuccess()
        {

            return View();
        }       
    }
}
